home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #05 (Dec85-Jan86) / modula2 / serial ports 2-1 / HackTerm.MOD < prev    next >
Text File  |  1985-11-23  |  4KB  |  163 lines

  1.  
  2. MODULE HackTerm;
  3.  
  4. (*    Written by Jeff Mitchell
  5.         Digital Solutions,  1985
  6.         
  7. This is a simple terminal emulator
  8. which completely bypasses the operating
  9. system for serial I/O.                                *)
  10.  
  11.  
  12. FROM    Terminal    IMPORT    BusyRead,Write,WriteLn,
  13.                                                 WriteString,ClearScreen;                                            
  14. FROM    InOut            IMPORT    ReadInt;                                                            
  15.  
  16.     CONST
  17.         (* Offsets into SCC registers *)
  18.         (* A channel is the modem port *)
  19.         aData        =  6;    (* A channel data *)
  20.         aCtl        =  2;    (* A channel control *)
  21.         (* B channel is the printer port *)
  22.         bData        =  4;    (* B channel data *)
  23.         bCtl        =  0; (* B channel control *)
  24.  
  25.         cntl_B    =  2;    (* ASCII value *)
  26.         cntl_C    =  3;    (* ASCII value *)
  27.         NULL        =  0;    (* ASCII value *)
  28.         
  29.     TYPE
  30.         SerPtr    = POINTER TO ARRAY [0..6] OF CHAR;
  31.         (* Needed for byte access *)
  32.         
  33.     VAR
  34.         SCCRd [1D8H]: SerPtr;    (* Read pointer *)
  35.         SCCWr    [1DCH]: SerPtr;    (* Write pointer *)
  36.         ch,status: CHAR;
  37.         bRate: INTEGER;
  38.         hiByte,loByte: CARDINAL;
  39.  
  40.  
  41.     PROCEDURE    GetChar (VAR ch: CHAR): BOOLEAN;
  42.     (*     Checks to see if a character has been
  43.             received and fetches it                         *)
  44.             
  45.         BEGIN
  46.             SCCWr^[aCtl]:= CHR(0); (* Tx, Rx status *)
  47.             status:= SCCRd^[aCtl];
  48.             IF ODD(ORD(status)) THEN    (* Test bit 0 *)
  49.                 ch:= SCCRd^[aData];    (* Rx char available *)
  50.                 RETURN TRUE
  51.             ELSE 
  52.                 RETURN FALSE            (* No char received *)    
  53.             END
  54.         END    GetChar;
  55.         
  56.     
  57.     PROCEDURE    PutChar (VAR ch: CHAR);
  58.     (*     Waits until transmit buffer empty then
  59.             outputs a character.                                *)
  60.             
  61.         BEGIN
  62.             REPEAT        (* Wait until xmit buffer empty *)
  63.                 SCCWr^[aCtl]:= CHR(0);    (* Tx, Rx status *)
  64.                 status:= SCCRd^[aCtl]
  65.             UNTIL ODD(ORD(status) DIV 4); (* Test bit 2 *)
  66.             SCCWr^[aData]:= ch                (* transmit char *)
  67.         END PutChar;
  68.         
  69.  
  70.     PROCEDURE SetBaud;
  71.     (*     Compute the time constant for the baud
  72.             rate generator and split it into high
  73.             and low bytes.                                                *)
  74.             
  75.         BEGIN
  76.             WriteLn;
  77.             WriteString('Desired baud rate? ');
  78.             ReadInt(bRate);
  79.             WriteLn;
  80.             
  81.             (* Compute baud rate generator time constants *)
  82.             hiByte:= (TRUNC(115000.0 / FLOAT(CARDINAL(bRate))) - 2) DIV 256;
  83.             loByte:= (TRUNC(115000.0 / FLOAT(CARDINAL(bRate))) - 2) MOD 256;
  84.             SCCWr^[aCtl]:= CHR(13);
  85.             SCCWr^[aCtl]:= CHR(hiByte);
  86.             SCCWr^[aCtl]:= CHR(12);
  87.             SCCWr^[aCtl]:= CHR(loByte)
  88.         END SetBaud;
  89.  
  90.  
  91. BEGIN    (* HackTerm *)
  92.     ClearScreen;
  93.     ch:= SCCRd^[aCtl];        (* Ensure ptr reg = 0 *)
  94.  
  95.     (* Reset channel A, enable all interrupts *)
  96.     SCCWr^[aCtl]:= CHR(9);    
  97.     SCCWr^[aCtl]:= CHR(136);    
  98.  
  99.     (* Enable external status interrupts *)
  100.     SCCWr^[aCtl]:= CHR(1);    
  101.     SCCWr^[aCtl]:= CHR(1);    
  102.  
  103.     (* Set Tx, Rx modes *)
  104.     SCCWr^[aCtl]:= CHR(4);    
  105.     SCCWr^[aCtl]:= CHR(76);    
  106.  
  107.     (* Set clock mode *)
  108.     SCCWr^[aCtl]:= CHR(11);    
  109.     SCCWr^[aCtl]:= CHR(80);    
  110.  
  111.     (* Set default baud rate to 300 *)
  112.     (* Lower byte *)
  113.     SCCWr^[aCtl]:= CHR(12);    
  114.     SCCWr^[aCtl]:= CHR(124);    
  115.  
  116.     (* Upper byte *)
  117.     SCCWr^[aCtl]:= CHR(13);    
  118.     SCCWr^[aCtl]:= CHR(1);    
  119.  
  120.     (* Enable baud rate generator *)
  121.     SCCWr^[aCtl]:= CHR(14);    
  122.     SCCWr^[aCtl]:= CHR(1);    
  123.  
  124.     (* Enable DCD (mouse) interrupts *)
  125.     SCCWr^[aCtl]:= CHR(15);    
  126.     SCCWr^[aCtl]:= CHR(8);    
  127.  
  128.     (* Set Rx parameters, enable receiver *)
  129.     SCCWr^[aCtl]:= CHR(3);    
  130.     SCCWr^[aCtl]:= CHR(193);    
  131.  
  132.     (* Set Tx parameters, enable transmitter *)
  133.     SCCWr^[aCtl]:= CHR(5);    
  134.     SCCWr^[aCtl]:= CHR(106);    
  135.     
  136.     
  137.     BusyRead(ch);
  138.     IF ORD(ch) <> cntl_C THEN
  139.         REPEAT
  140.             IF ORD(ch) = cntl_B THEN
  141.                 SetBaud
  142.             ELSE
  143.                 IF ORD(ch) <> NULL THEN
  144.                     PutChar(ch)                
  145.                 END
  146.             END;
  147.             
  148.             WHILE GetChar(ch) DO
  149.                 Write(ch)
  150.             END;
  151.                         
  152.         BusyRead(ch);
  153.         UNTIL ORD(ch) = cntl_C
  154.     END
  155.     
  156. END HackTerm.
  157.     
  158.         
  159.         
  160.     
  161.     
  162.         
  163.